/**
 * Copyright  2025, Hai Yue Xing He Technology Co., Ltd
 * 
 * @author        ZHAO LIMIN
 * @version       1.0.1
 * @since         2025-04
 */
import {ICartesian} from "./Cartesian";             // 坐标信息
import { UNION_NUMBER_ARRAY } from "./HDataType";
/**
 * 矩形区域，用于描述屏幕或者矩形区域
 */
export interface HYXHRect{
    left    : number;
    top     : number;
    width   : number;
    height  : number
}

export interface ILineIndex {
    indices: Uint32Array;               // 索引数组， 
                                        //一个线段由两个点组成， 所以一个线段有两个索引值
                                        // 一个顶点的索引：[layer, index],  一个线段的索引：[layer0, index0, layer1, index1]    

    /**
     * 根据点，读取相互关联的线段的index，用于进行遍历, 返回值是 
     * [[layer0,index0, layer1, index1]], 通过读取确定路径，
     */
    indexLines(layer:number, pointIndex: number): UNION_NUMBER_ARRAY;
    /**
     * 根据点，或者关联线段列表，排除来的方向
     * @param layer 
     * @param pointIndex 
     * @param elayer        需要排除点索引
     * @param epointIndex   需要排除点索引
     */
    indexLinesExude(layer:number, pointIndex: number, elayer: number, epointIndex: number): UNION_NUMBER_ARRAY;
    /**
     * 增加新的连接索引
     */
    pushIndexLine(slayer: number, spointIndex: number, elayer: number, epointIndex: number)
    
}

/**
 * 矢量图形接口，用于定义在游戏中，应用的矢量图
 * 比如路径导航及迁移。 是对手有自动领航的需求
 * 在秘境探索，处理中应用
 * 和cc.Line 进行绑定，并进行坐标转换
 * 相交、相叠、相抵触，用cc 的物理系完成
 */
export interface HGeometry {
    
    /**
     * 
     * @param layer 层， 在Polyline 和Polygon ， MuliPoint 中， 可以有多个层
     * @returns     返回坐标点的数组，可以number[], Int8Array     
     */
    pack(layer: number, array: UNION_NUMBER_ARRAY, startIndex: number): UNION_NUMBER_ARRAY;
    /**
     * 
     * @param layer 
     * @param array 
     * @param startIndex  起始索引, 从Array 中的第几个元素开始
     */
    unpack(layer: number, array: UNION_NUMBER_ARRAY, startIndex: number);
    /**
     * 返回数组坐标中，一个顶点所在的数组位数， 当前默认是3
     * @returns 
     */
    pckagedLength(): number;
     

    /**
     * 在指定层上增加坐标点， 支持多层Polyline、Polygon、MultiPonts、netsline
     * @param layer         层
     * @param newPoint 
     * @returns             返回增加后的点的数量
     */
    pushBack(layer: number, newPoint : ICartesian) : number;
    /**
     * 
     * @param other 其他同类Geometry
     * @returns     返回true 表示相同，false 表示不相同
     */
    equals(other : HGeometry) :boolean;
    /**
     * 更新坐标，在设置新的图形信息后，进行更新
     */
    update(): boolean;
}